﻿using System;
using System.ServiceModel;
using System.Collections.Generic;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Security.Services;
using Sinacor.Infra.Common;
using Sinacor.Infra.Common.Exceptions.FaultContracts;

namespace Sinacor.Servico.Bovespa.Corretagem.Service.ServiceContract
{
    /// <summary>
    /// Contrato de serviço para política de corretagem
    /// </summary>
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Corretagem.Service.ServiceContract", SessionMode = SessionMode.Allowed, Name = "IPoliticaCorretagem")]
    public interface IPoliticaCorretagem
    {
        #region Métodos

        /// <summary>
        /// Consulta políticas de corretagem conforme filtro.
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ConsultarPoliticasCorretagens")]
        List<DataContract.Response.PoliticaCorretagemResponse> ConsultarPoliticasCorretagens(DataContract.Request.FiltroPoliticaCorretagemRequest request);

        /// <summary>
        /// Obtem uma política de corretagem
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ObterPoliticaCorretagem")]
        DataContract.Response.PoliticaCorretagemResponse ObterPoliticaCorretagem(DataContract.Request.FiltroPoliticaCorretagemChaveRequest request);

        /// <summary>
        /// Exclui uma política de corretagem
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExcluirPoliticaCorretagem")]
        void ExcluirPoliticaCorretagem(DataContract.Request.FiltroPoliticaCorretagemChaveRequest request);

        /// <summary>
        /// Duplica uma política de corretagem bem como suas entidades dependencias.
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "DuplicarPoliticaCorretagem")]
        DataContract.Response.PoliticaCorretagemResponse DuplicarPoliticaCorretagem(DataContract.Request.FiltroPoliticaCorretagemChaveRequest request);

        /// <summary>
        /// Inclui uma nova política de corretagem
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "IncluirPoliticaCorretagem")]
        void IncluirPoliticaCorretagem(DataContract.Request.PoliticaCorretagemRequest request);

        /// <summary>
        /// Altera uma política de corretagem
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "AlterarPoliticaCorretagem")]
        void AlterarPoliticaCorretagem(DataContract.Request.PoliticaCorretagemRequest request);

        #endregion
    }
}